home *** CD-ROM | disk | FTP | other *** search
/ Aminet 22 / Aminet 22 (1997)(GTI - Schatztruhe)[!][Dec 1997].iso / Aminet / dev / e / bezier.lha / bezier.txt < prev   
Text File  |  1997-10-01  |  6KB  |  122 lines

  1. BEZIER CURVES by Storm/Cydonia  [taken from Defy #4 by Cydonia]
  2.  
  3. Nobody  has  ever written any sort of coding lesson in Defy before, so, for
  4. issue #4, I decided to do one! Now, I could have written all sorts of wanky
  5. stuff  for  beginners,  how  to get started coding demos, or some crap like
  6. that.  But  no! Instead, I decided to write a little article on how to draw
  7. Bezier Curves.
  8.  
  9. What's a Bezier curve?
  10.  
  11. Well simply enough, it's a curve which is defined by two points marking the
  12. start  and  end  of  the  curve,  and  one  or more "control points", which
  13. determine  how  curvy it is. The curves I'll be talking about here are ones
  14. which  have  two  control points as well as the start and end points. These
  15. are also known as cubic Bezier curves.
  16.  
  17. What do the control points do?
  18.  
  19. The  curve does not pass through the control points. It just curves towards
  20. them.  For  the technically minded, the tangent (or direction of the curve)
  21. at  the  startpoint  is equal to a straight line from the startpoint to the
  22. first control point; and the tangent at the endpoint is equal to a straight
  23. line from the endpoint to the second control point. Have a look at figure 1
  24. to get an idea of this!
  25.  
  26. How do you draw the curve?
  27.  
  28. The  basic  way  to draw the curve involves a cubic parametric equation. If
  29. you  choked  on  that  phrase  - this basically means equations with values
  30. squared and values cubed in them! Surely you do not want to figure out such
  31. things  in  a  speedy  demo.  Luckily,  there  is  another  method, ÿcalled
  32. "recursive subdivision" which avoids all this ugly maths. Now, when I first
  33. taught  myself  this  shit,  I  never  learnt this method because it looked
  34. really  complicated in the textbook I had. So I did a shitty Bezier routine
  35. with  heaps  of  MULs  in  it  -  slow!!  But, then I got another book, and
  36. discovered  that  this  subdivision  method  is  not  only much faster, but
  37. genuinely easier to understand! So that's what I'll be teaching here.
  38.  
  39. What is recursive subdivision?
  40.  
  41. OK,  you  have  a Bezier curve. Let's say that instead of drawing the curve
  42. properly,  you  just  drew  a  straight  line  from  the  startpoint to the
  43. endpoint.  Now  this  would be an approximation of the curve - a completely
  44. terrible  one,  but an approximation nevertheless. But what if there was an
  45. easy  way  to  split  the  curve  into  two  separate  curves,  each with a
  46. startpoint  and an endpoint (the endpoint of the first would be the same as
  47. the  startpoint of the second of course) and two control points? See figure
  48. 2  for what this would look like. If you could do this, you could split the
  49. curve, then approximate each half with a straight line. Slightly better but
  50. still  crap.  But  if  you  split each half in half, and so on a few times,
  51. until  you  had  maybe  32  or  64 straight lines, then it would be looking
  52. pretty much like a smooth curve!
  53.  
  54. Luckily,  there IS an easy way to do this! All it takes is the averaging of
  55. some  values  (so  in  assembly,  just  some ADDs and some 1-bit LSRs).. no
  56. multiplying or anything slow like that! And here's the maths for it:
  57.  
  58. You  have  a  curve. Let's call the 4 points that make it up P1, P2, P3 and
  59. P4.  P1  is  the  startpoint, P4 is the endpoint, and P2 and P3 are the two
  60. control  points.  We  want to split this into 2 curves. Well call the point
  61. that make up the first curve L1, L2, L3 and L4, and the points that make up
  62. the  second  curve R1, R2, R3 and R4. Remember that L4 and R1 are the same,
  63. this is the midpoint of the original curve where the two new curves meet.
  64.  
  65. L1 = P1                 These are the start and end
  66. R4 = P4                 points of the original curve.
  67.  
  68. L2 = average(P1,P2)
  69. R3 = average(P3,P4)
  70. H  = average(P2,P3)     H isn't part of either curve, but we'll need it to
  71.                         figure out L3 and R2.
  72. L3 = average(L2,H)
  73. R2 = average(R3,H)
  74. L4 = R1 = average(L3,R2)
  75.  
  76. If you'd like to see what all this looks like, check out figure 3!
  77.  
  78. When  I say that one point is the average of two other points, it of course
  79. means  that you average the X values of those two to get the X value of the
  80. new  point, and also average the Y values. If you're working in 3D, average
  81. the  Z  values too! In assembly, you can of course average two numbers just
  82. by adding them together and shifting the result right one bit.
  83.  
  84. Now what do I do?
  85.  
  86. Alright,  you've  split the curve in half, split the halves in half, and so
  87. on,  a  few times, and now have maybe 64 little Bezier curves. You're going
  88. to  pretend that they're not really curves and draw them as straight lines.
  89. How  you  do  this  is up to you! Surely you have some source handy to draw
  90. lines  using  the  blitter?  Or,  if  you  use a higher-level language than
  91. assembly,  you've  probably  got  a  Line command to do it for you, so that
  92. shouldn't be a problem.
  93.  
  94. Bezier  curves  are  a nice simple way to draw curved objects and spin them
  95. around  in  2D or 3D space. Think of all the multiplication that's involved
  96. in  3D  rotation  -  if  you  made up a curved object with lots of straight
  97. lines,  then  rotated it in 3D space, you'd have to rotate HEAPS of points.
  98. But by making it a Bezier curve, you only have to rotate the 4 points, then
  99. you can figure out all the individual lines using, as I said, only ADDs and
  100. LSRs. /<-Rad, hey!
  101.  
  102. Making objects.
  103.  
  104. If  you  want  to  make  up an object out of multiple Bezier curves, you'll
  105. probably  be  wanting  them  to  join  together  smoothly,  so it's one big
  106. smoothly  curved  object, not one visibly made of separate curved sections.
  107. Here's how you do it. Let's call the two curves A and B, so the points that
  108. make  them up are A1, A2, A3, A4, B1, B2, B3 and B4. A4 and B1 are the same
  109. point  (endpoint  of  A  and  startpoint  of B). Now, remember how figure 1
  110. showed  what  the  control points did? It should be apparent that if A3, A4
  111. (=B1)  and  B2  all  lie  on a straight line, then curves A and B will join
  112. together smoothly. See figure 4 for this in action!
  113.  
  114. And that's it!
  115.  
  116. Well,  with  the  info  &  maths  in  this  article,  you should be able to
  117. construct  complex  curved  objects out of multiple Bezier curves, and then
  118. translate,  scale  &  rotate  them  in  3D  space with minimal calculation.
  119. Hopefully there are some coders out there who will benefit from this info!!
  120.  
  121. Thanks Storm! I might even have a go myself! - Ed.
  122.